#ifndef TCP_WIDGET_H
#define TCP_WIDGET_H

#include <QCheckBox>
#include <QComboBox>
#include <QFile>
#include <QHBoxLayout>
#include <QHostAddress>
#include <QLabel>
#include <QLineEdit>
#include <QList>
#include <QNetworkInterface>
#include <QPushButton>
#include <QStringList>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QString>

#include "utils/utils.h"

class TcpWidget : public QWidget {
    Q_OBJECT
  public:
    TcpWidget(QWidget *parent = nullptr);

  private slots:
    void on_protocolComboBox_textChanged(const QString &text);              // 下拉框选择事件
    void on_clearButton_clicked();                                          // 清空按钮点击事件
    void on_startOrStopButton_clicked();                                    // 开始/停止按钮点击事件
    void clientConnected();                                                 // 客户端连接事件  
    void socketStateChange(QAbstractSocket::SocketState state);             // socket状态改变事件
    void receiveMessage();                                                  // 接收消息事件
    void sendMessage();

  private:
    void initUI();
    void loadStyleSheet();
    void initModel();                      // 初始化下拉框值
    void getLocalHostIP();                 // 获取本机IP
    void initBindingSignalSlot();          // 初始化信号与槽的绑定
    void startListen();                    // 开始监听
    void stopListen();                     // 停止监听
    void toConnect();                      // 连接
    void toDisconnect();                   // 断开连接

  private:
    QTextEdit *textEdit;
    QComboBox *protocolComboBox;
    QComboBox *localIPComboBox;
    QLineEdit *serverIPLineEdit;
    QLineEdit *listenPortLineEdit;
    QCheckBox *hexShowCheckBox;
    QCheckBox *autoLineCheckBox;
    QCheckBox *hexSendCheckBox;
    QCheckBox *showTimeCheckBox;
    QPushButton *clearButton;
    QPushButton *startOrStopButton;
    QTextEdit *sendTextEdit;
    QPushButton *sendButton;
    QLabel *statusLabel;
    QLabel *sendLabel;
    QLabel *recvLabel;

    QList<QHostAddress> ipList;
    QTcpServer *tcpServer;
    QTcpSocket *tcpSocket;
    QTcpSocket *clientSocket;
    bool isStartListen = false;

    int readCount;
    int writeConunt;
};

#endif